import Vue from "vue";
import VueRouter from "vue-router";
import { readToken, deleteToken } from "@/utils/auth";
import routes from "./routes";
import store from "@/store";
Vue.use(VueRouter);
// 对push replace方法进行增强

// const originPush = VueRouter.prototype.push
// VueRouter.prototype.push = function(location,okCallback,errCallback){
//   if(okCallback || errCallback){
//     // return返回出去 谁调用就返回给谁
//     return originPush.call(this,location,okCallback,errCallback)
//   }else{
//     return originPush.call(this,location).catch(()=>{})
//   }
// }

// 封装增强方法
function origin(target, type) {
  // 因为type是一个变量 所以只能用这种方式拿到属性
  const origin = target.prototype[type];
  target.prototype[type] = function (location, okCallback, errCallback) {
    if (okCallback || errCallback) {
      return origin.call(this, location, okCallback, errCallback);
    } else {
      return origin.call(this, location).catch(() => {});
    }
  };
}

// VueRouter是一个实例对象
origin(VueRouter, "push");
origin(VueRouter, "replace");

// 创建路由对象
let router = new VueRouter({
  // history 模式
  mode: "history",
  routes,
  scrollBehavior(to, from, savePosition) {
    if (savePosition) {
      return savePosition;
    } else {
      return { x: 0, y: 0 };
    }
  },
});

// 需要登录 token 鉴权 的 路由地址
let authPath = ["/trade",'/paysuccess','/center','/pay'];
// 设置全局路由守卫
router.beforeEach(async (to, from, next) => {
  // 1.to-即将要进入的路由对象
  // 2.from-即将要离开的路由对象
  // 3.next:确认要进入的路由对象
  // 获取token
  let token = readToken();
  // 判断是否有token
  if (token) {
    // 获取用户信息 在vuex中
    let { userinfo } = store.state.user;
    // 判断是否有用户信息
    if (userinfo.id) {
      // 直接放行
      next();
    } else {
      // 用户信息不存在 请求获取用户信息
      try {
        // token存在 重新获取用户信息
        await store.dispatch("user/asyncgetUserInfo");
        // 放行
        next();
      } catch (error) {
        // 删除token
        deleteToken();
        // 跳转到登录页面
        next("/login");
      }
    }
  } else {
    // 如果确定要去结算页面  必须要跳到登录
    if (authPath.includes(to.path)) {
      next("/login");
    } else {
      // 如果不是就放行 进到页面
      next();
    }

    // token不存在 没有登录不允许访问敏感路由【支付，个人中心，订单，收货地址】
    next();
  }
});
// 暴露router
export default router;
